import { Provide } from '@midwayjs/core';
import { BaseService, CoolCommException } from '@cool-midway/core';
import { InjectEntityModel } from '@midwayjs/typeorm';
import { Repository, Between, Not, LessThan, MoreThan, In } from 'typeorm';
import { ClassInfoEntity } from '../entity/info';
import  { AppointmentInfoEntity } from '../../appointment/entity/info';

/**
 * 班级信息
 */
@Provide()
export class ClassInfoService extends BaseService {
  @InjectEntityModel(ClassInfoEntity)
  classInfoEntity: Repository<ClassInfoEntity>;

  @InjectEntityModel(AppointmentInfoEntity)
  appointmentInfoEntity: Repository<AppointmentInfoEntity>;

  /**
   * 重写add方法以支持优惠券状态更新
   */
  async add(param) {
    // 在创建之前查看是否跟已存在预约冲突
    console.log(param);
    // 在创建之前查看是否跟已存在预约冲突
    if (param.startTime && param.endTime) {
      // 将开始时间减去一分钟
      const adjustedStartTime = new Date(param.startTime);
      adjustedStartTime.setMinutes(adjustedStartTime.getMinutes() + 1);
      const adjustedendTime = new Date(param.endTime);
      adjustedendTime.setMinutes(adjustedendTime.getMinutes() - 1);
      // 查询该时间段内是否存在预约
      // const appointments = await this.appointmentInfoEntity.find({
      //   where: {
      //     shopId: param.shopId,
      //     appointmentTime: Between(new Date(param.startTime), new Date(adjustedendTime)),
      //     appointmentStatus: Not(In([2, 4])) // 假设 0 表示已预约状态
      //   }
      // });

      // if (appointments && appointments.length > 0) {
      //   console.log(appointments);
      //   throw new CoolCommException('该时间段内已存在预约，请选择其他时间');
      // }
      // 查询该时间段内是否存在其他班级
      const existingClasses = await this.classInfoEntity.find({
        where: [
          {
            // 情况1：已存在班级的结束时间在新班级时间范围内，允许结束时间跟开始时间重叠
            shopId: param.shopId,
            status: Not(0),
            endTime: Between(new Date(adjustedStartTime), new Date(param.endTime))
          },
          {
            // 情况2：已存在班级的开始时间在新班级时间范围内，允许开始时间跟结束时间重叠
            shopId: param.shopId,
            status: Not(0),
            startTime: Between(new Date(param.startTime), new Date(adjustedendTime))
          },
          {
            // 情况3：已存在班级的开始时间在新班级时间范围外
            shopId: param.shopId,
            status: Not(0),
            startTime: LessThan(new Date(adjustedStartTime)),
            endTime: MoreThan(new Date(adjustedendTime))
          },
          {
            // 情况4：已存在班级的结束时间在新班级时间范围内
            shopId: param.shopId,
            status: Not(0),
            startTime: MoreThan(new Date(param.startTime)),
            endTime: LessThan(new Date(param.endTime))
          }
        ]
      });
      // 格式化时间输出
      const formattedStartTime = adjustedStartTime.getFullYear() + '-' + 
        String(adjustedStartTime.getMonth() + 1).padStart(2, '0') + '-' + 
        String(adjustedStartTime.getDate()).padStart(2, '0') + ' ' + 
        String(adjustedStartTime.getHours()).padStart(2, '0') + ':' + 
        String(adjustedStartTime.getMinutes()).padStart(2, '0');
      const formattedEndTime = adjustedendTime.getFullYear() + '-' + 
      String(adjustedendTime.getMonth() + 1).padStart(2, '0') + '-' + 
      String(adjustedendTime.getDate()).padStart(2, '0') + ' ' + 
      String(adjustedendTime.getHours()).padStart(2, '0') + ':' + 
      String(adjustedendTime.getMinutes()).padStart(2, '0');
      console.log(param.startTime, param.endTime, formattedStartTime, formattedEndTime);

      if (existingClasses && existingClasses.length > 0) {
        throw new CoolCommException('该时间段内已存在其他班级，请选择其他时间');
      }
    }
    const result = await super.add(param);
    return result;
  }
}
